๋ฐฑ์๋
ChatController (์ปจํธ๋กค๋ฌ)
๋๊ธฐ ์ฒ๋ฆฌ(ํ์ด์ง ์ด๋)
chatting()
์ฌ์ฉ์๊ฐ ์ฑํ ๋ฐฉ ์ ์ํ ๋ ํธ์ถ.
- ๊ฒฝ๋ก:ย
GET /chat/main/{serverNo}/{channelNo}
- ๊ณผ์ :
- ๋ก๊ทธ์ธ ํ์ ์ ๋ณด ํ์ธ
- model์ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ์๋ฒ ๋ชฉ๋ก / ์ฑ๋ ๋ชฉ๋ก/ ์๋ฒ ๋ฉค๋ฒ ๋ชฉ๋ก/ ์๋ฒ ์ด๋ฆ / ๊ด๋ฆฌ์ ์ฌ๋ถ / ์ฑํ ๋ฉ์์ง๋ค / ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง
- ์ฑ๋ ํ์ ์ ๋ง๋ ํ์ด์ง๋ก ์ด๋(๋ทฐ ๋ฐํ)
selectSmallestChatNo()
๋น๋๊ธฐ ๋ฐฉ์์ด์ง๋ง ํ์ด์ง ์ด๋์ ์ฌ์ฉ๋จ.
์ฌ์ฉ์๊ฐ ํน์ ์ฑ๋์ ํด๋ฆญํ์ง ์๊ณ ์๋ฒ๋ฅผ ํด๋ฆญํ์๋ ํธ์ถ.
- ๊ฒฝ๋ก:ย
POST /chat/selectSmallestChatNo
- ๊ณผ์ :
- ํด๋ผ์ด์ธํธ์์ ์ ์กํ ์๋ฒ๋๋ฒ์์ ๊ฐ์ฅ ์์ ์ฑ๋๋๋ฒ๋ฅผ ๊ฐ์ ธ์จ๋ค.
sService.selectChannelNo(serverNo)
- ๋ฐํ.
ํด๋ผ์ด์ธํธ๋ ๋ฐํ๋ฐ์ ์ฑ๋๋๋ฒ๋ก ๋ค์ ์์Chatting()
์ผ๋ก ์ฌ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก ์๋.
- ํด๋ผ์ด์ธํธ์์ ์ ์กํ ์๋ฒ๋๋ฒ์์ ๊ฐ์ฅ ์์ ์ฑ๋๋๋ฒ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ฑํ ๋ฉ์์ง ์ ์ก
sendMessage()
์ฑํ ๋ฉ์์ง DB์ ์ฅ, WebSocket ๋ฐํ
- ๊ฒฝ๋ก:ย
@MessageMapping("/chat/{channelNo}/{separetor}")
- ํด๋ผ์ด์ธํธ์ชฝ์์๋
pub/chat/{}/{}
์ฃผ์๋ก ์ ์ก.
- ํด๋ผ์ด์ธํธ์ชฝ์์๋
- ๊ณผ์ :
- ์ธ์ ์์ ๋ก๊ทธ์ธ ๋ฉค๋ฒ ์ ๋ณด ์กฐํ
- ๋ฉ์์ง ๊ฐ์ฒด์ ๋ค์์ ์ ๋ณด ์ ์ฅ
- ์ฌ์ฉ์ ํ๋กํ ์ฌ์ง, ์ฑ๋๋๋ฒ, ๊ตฌ๋ถ์(separator : ๋ฌธ์์ฑํ or ํ์์ฑํ )
- Firebase์ ๋ฉ์์ง ์ ์ฅ
cService.insertChat(message)
- WebSocket ๋ฐํ
messagingTemplate.convertAndSend(์ฃผ์ (๊ฒฝ๋ก), ๋ฉ์์ง)
Voice ์ฑํ ๊ด๋ จ
joinVoiceChannel()
์์ฑ ์ฑํ ๋ฐฉ ์ ์ฅ ์ฒ๋ฆฌ
- ๊ฒฝ๋ก:ย
@MessageMapping("/chat/joinVoice")
- ํด๋ผ์ด์ธํธ ์ชฝ์์๋
pub/chat/joinVoice
์ฃผ์๋ก ์ ์ก
- ํด๋ผ์ด์ธํธ ์ชฝ์์๋
- ๊ณผ์ : ์ฌ์ฉ์๋ฅผ ์์ฑ ์ฑ๋ ๋งต์ ์ถ๊ฐํ๊ณ ์ ์ฒด ๋ชฉ๋ก ๋ฐํ.
joinVoiceChannel() (์์ ๋ฉ์๋์ ๋ค๋ฆ)
ํ์ฌ ์์ฑ ์ฑํ ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ
- ๊ฒฝ๋ก :ย
GET /chat/api/voiceUsers
- ๊ณผ์ :
userInChannel
(์ฑ๋ ์ฐธ๊ฐ์ ๋งต)๊ฐ์ฒด ๋จ์ ๋ฐํ.
leaveVoiceChannel()
์์ฑ ์ฑํ ๋ฐฉ ํด์ฅ ์ฒ๋ฆฌ
- ๊ฒฝ๋ก:ย
@MessageMapping("/chat/leaveVoice")
- ๊ณผ์ : ์ฌ์ฉ์๋ฅผ
userInChannel
(์ฑ๋ ์ฐธ๊ฐ์ ๋งต)์์ ์ ๊ฑฐ.
WebRTC ๊ด๋ จ ๋ฉ์๋๋ค (์์ ํตํ)
PeerHandleOffer()
(์ฌ์ฉ ์๋จ)
WebRTC Offer ์ ๋ณด ์ค๊ณ
- ๊ฒฝ๋ก:ย
@MessageMapping("/peer/offer/{camKey}/{roomId}")
PeerHandleIceCandidate()
ICE Candidate ์ ๋ณด ์ค๊ณ ๋ฐ ๋น๋์ค ์ฐธ๊ฐ์ ๊ด๋ฆฌ
- ๊ฒฝ๋ก :ย
@MessageMapping("/peer/iceCandidate/{camKey}/{roomId}")
- ๊ณผ์ :
videoInChannel
(์ฑ๋ ์ฐธ๊ฐ์ ๋งต) ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ camKey๊ฐ ์๋์ง ํ์ธํ๊ณ ์ด๋ฏธ ์์ผ๋ฉด ์ ๊ฑฐ. (์ค๋ณต ์ฐธ๊ฐ ๋ฐฉ์ง)videoInChannel.computeIfAbsent()
๋ก ์ฌ์ฉ์๋ฅผ ๋งต์ ์ฝ์ ํ๋ค. (computeIfAbsent()
๋ฉ์๋๋ ์ค๋ ๋ ์์ ์ฑ์ ์ํด์ ์ฌ์ฉ๋๋ค.)
PeerHandleAnswer()
(์ฌ์ฉ ์๋จ)
WebRTC Answer ์ ๋ณด ์ค๊ณ
- ๊ฒฝ๋ก:ย
@MessageMapping("/peer/answer/{camKey}/{roomId}")
callKey(),ย sendKey()
์์ํตํ์ฉ ํค ๊ตํ
- ๊ฒฝ๋ก:ย
@MessageMapping("/call/key")
,ย@MessageMapping("/send/key")
ICE ํ๋ณด?
ICE Candidate๋ WebRTC๋ฅผ ์ฌ์ฉํด ํ์ํตํ๋ฅผ ์งํํ ๋ ํ์ํ ์ ๋ณด๋ค์ด๋ค.
๊ฐ ํด๋ผ์ด์ธํธ์์ ํ์ํตํ์ ํ์ํ ์ฌ๋ฌ ์ ๋ณด๋ค์ ์๋ฒ๋ก ๋ณด๋ด๋ฉด ์๋ฒ์์ ์ค๊ณ ๋ก์ง์ ๋ฐ๋ผ ์ต์ ์ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ ค์ค๋ค.
(ํ์ฌ ํ๋ก์ ํธ์๋ ๋ก์ง์ด ๊ตฌํ๋์ง ์๊ณ , ๋จ์ํ ๊ฐ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ๋ง)ํค?
Key๋ ์ ์๋ ์ฌ์ฉ์๋ค์ ์๋ณ์(์ด๋ฆ) ์ญํ .
์ฐธ๊ฐ์ ๊น,์ด,๋ฐ์ด ํ์ํตํ์ ์ ์ํ๋ฉด ๊ฐ๊ฐ ํค A,B,C๋ฅผ ๋ถ์ฌ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํค๋ฅผ ์ฌ์ฉํด ๊ฐ ํด๋ผ์ด์ธํธ๋ผ๋ฆฌ ๋น๋์ค ์คํธ๋ฆผ์ ์ฃผ๊ณ ๋ฐ๋๋ค.
ChatService (์๋น์ค)
์ฑ๋ ๊ด๋ จ
chattingSidebar()
ํน์ ์๋ฒ์ ์ฑ๋ ๋ชฉ๋ก ์กฐํ
- ์ฐ๊ฒฐ:ย
ChatController.chatting()
ย โ DB์์ ์ฑ๋ ์ ๋ณด ์กฐํ
selectChannel()
ํน์ ์ฑ๋ ์ ๋ณด ์กฐํ (ํ์ ํ์ธ์ฉ)
- ์ฐ๊ฒฐ:ย
ChatController.chatting()
ย โ ์ฑ๋์ด Voice์ธ์ง Chat์ธ์ง ํ๋ณ
Firebase ์ฑํ ๋ฉ์์ง ๊ด๋ จ
insertChat()
์ฑํ ๋ฉ์์ง๋ฅผ Firebase Firestore์ ์ ์ฅ
- ์ฐ๊ฒฐ:ย
ChatController.sendMessage()
ย โ Firebase "RealMan01" ์ปฌ๋ ์ ์ ์ ์ฅ - ์ ์ฅ ๋ฐ์ดํฐ: ๋ฉ์์ง ๋ด์ฉ, ๋๋ค์, ์์ฑ์๊ฐ, ์ฑ๋๋ฒํธ, ๊ตฌ๋ถ์
selectChatList()
์ฑํ ๋ฉ์์ง ๋ชฉ๋ก์ Firebase์์ ์กฐํ
- ์ฐ๊ฒฐ:ย
ChatController.chatting()
ย โ Firebase์์ ํน์ ์ฑ๋์ ๋ฉ์์ง ์กฐํ - ๊ณผ์ :
- Firebase์์ ์ฑ๋๋ณ ๋ฉ์์ง ์กฐํ (์์ฑ์ผ ์ญ์)
- ์๊ฐ ํฌ๋งท ๋ณํ (24์๊ฐ์ /12์๊ฐ์ )
- ChatMessage ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ๋ฐํ.
DM(Direct Message) ๊ด๋ จ
createDM()
DM ์ฑํ ๋ฐฉ ์์ฑ
insertDM()
DM ๋ฉ์์ง๋ฅผ Firebase์ ์ ์ฅ
- ๊ณผ์ : "RealMan01" ์ปฌ๋ ์ ์ DM ์ ๋ณด ์ ์ฅ
selectDmList()
ํน์ ํ์์ DM ๋ชฉ๋ก ์กฐํ
- ์ฐ๊ฒฐ: DB์์ DM ๋ชฉ๋ก ์กฐํ
selectDm()
ํน์ DM ์ฑํ ์ ๋ฉ์์ง ๋ชฉ๋ก ์กฐํ
- ๊ณผ์ : Firebase์์ DM ๋ฉ์์ง ์กฐํ ๋ฐ ์๊ฐ ํฌ๋งท ๋ณํ
selectDmUseNickname(),ย findDMByMembers()
๋๋ค์/๋ฉค๋ฒ ์ ๋ณด๋ฅผ ํตํ DM ์กฐํ